home *** CD-ROM | disk | FTP | other *** search
/ Aminet 30 / Aminet 30 (1999)(Schatztruhe)[!][Apr 1999].iso / Aminet / dev / cross / GBDK-2.0.lha / GBDK / lib / drawing.s < prev    next >
Text File  |  1998-11-26  |  9KB  |  671 lines

  1.     .include    "global.s"
  2.  
  3.     .globl    .init_vram
  4.     .globl    .copy_vram
  5.  
  6.     .SOLID    =   0x00
  7.     .OR    =   0x01
  8.     .XOR    =   0x02
  9.     .AND    =   0x03
  10.  
  11.     .area    _HEADER (ABS)
  12.  
  13.     .org    .MODE_TABLE+4*.G_MODE
  14.     JP    .gmode
  15.  
  16.     .module    Drawing
  17.  
  18.     .area    _CODE
  19.  
  20.     ;; Enter graphic mode
  21. .gmode::
  22.     DI            ; Disable interrupts
  23.  
  24.     ;; Turn the screen off
  25.     LDH    A,(.LCDC)
  26.     BIT    7,A
  27.     JR    Z,1$
  28.  
  29.     ;; Turn the screen off
  30.     CALL    .display_off
  31. 1$:
  32.     LD    HL,#0x8000+0x10*0x10
  33.     LD    DE,#0x1800-0x18*0x10
  34.     LD    B,#0x00
  35.     CALL    .init_vram    ; Init the charset at 0x8000
  36.  
  37.     ;; Install interrupt routines
  38.     LD    BC,#.vbl
  39.     CALL    .add_VBL
  40.     LD    BC,#.lcd
  41.     CALL    .add_LCD
  42.  
  43.     LD    A,#72        ; Set line at which LCD interrupt occurs
  44.     LDH    (.LYC),A
  45.  
  46.     LD    A,#0b01000100    ; Set LCD interrupt to occur when LY = LCY
  47.     LDH    (.STAT),A
  48.  
  49.     LDH    A,(.IE)
  50.     OR    #0b00000010    ; Enable LCD interrupt
  51.     LDH    (.IE),A
  52.  
  53.     ;; (9*20) = 180 tiles are used in the upper part of the screen
  54.     ;; (9*20) = 180 tiles are used in the lower part of the screen
  55.     ;; => We have 24 tiles free
  56.     ;; We keep 16 at 0x8000->0x80FF, and 8 at 0x9780->97FF
  57.  
  58.     LD    HL,#0x9800
  59.     LD    A,#0x10        ; Keep 16 tiles free
  60.     LD    BC,#12        ; 12 unused columns
  61.     LD    E,#18        ; 18 lines
  62. 2$:
  63.     LD    D,#20        ; 20 used columns
  64. 3$:
  65.     LD    (HL+),A
  66.     INC    A
  67.     DEC    D
  68.     JR    NZ,3$
  69.     ADD    HL,BC
  70.     DEC    E
  71.     JR    NZ,2$
  72.  
  73.     ;; Turn the screen on
  74.     LDH    A,(.LCDC)
  75.     OR    #0b10010001    ; LCD        = On
  76.                 ; BG Chr    = 0x8000
  77.                 ; BG        = On
  78.     AND    #0b11110111    ; BG Bank    = 0x9800
  79.     LDH    (.LCDC),A
  80.  
  81.     LD    A,#.G_MODE
  82.     LD    (.mode),A
  83.  
  84.     EI            ; Enable interrupts
  85.  
  86.     RET
  87.  
  88. .vbl::
  89.     LDH    A,(.LCDC)
  90.     OR    #0b00010000    ; Set BG Chr to 0x8000
  91.     LDH    (.LCDC),A
  92.  
  93.     LD    A,#72        ; Set line at which LCD interrupt occurs
  94.     LDH    (.LYC),A
  95.  
  96.     RET
  97.  
  98. .lcd::
  99. 1$:
  100.     LDH    A,(.STAT)
  101.     BIT    1,A
  102.     JR    NZ,1$
  103.  
  104.     LDH    A,(.LCDC)
  105.     AND    #0b11101111    ; Set BG Chr to 0x8800
  106.     LDH    (.LCDC),A
  107.  
  108.     RET
  109.  
  110.     ;; Draw a full-screen image at (BC)
  111. .draw_image::
  112.     LD    HL,#0x8000+0x10*0x10
  113.     LD    DE,#0x1680
  114.     CALL    .copy_vram    ; Move the charset
  115.     RET
  116.  
  117.     ;; Replace tile data at (B,C) with data at DE and store old value at HL
  118. .switch_data::
  119.     PUSH    DE        ; Save src
  120.     PUSH    HL        ; Save dst
  121.     LD    DE,#0x8000+0x10*0x10
  122.     LD    L,B
  123.     SLA    L
  124.     SLA    L
  125.     SLA    L
  126.     LD    H,#0x00
  127.     ADD    HL,HL
  128.     ADD    HL,DE
  129.     LD    D,H
  130.     LD    E,L
  131.  
  132.     LD    HL,#.y_table
  133.     SLA    C
  134.     SLA    C
  135.     SLA    C
  136.     LD    B,#0x00
  137.     ADD    HL,BC
  138.     ADD    HL,BC
  139.     LD    B,(HL)
  140.     INC    HL
  141.     LD    H,(HL)
  142.     LD    L,B
  143.     ADD    HL,DE
  144.  
  145.     LD    B,H        ; BC = src
  146.     LD    C,L
  147.     POP    HL        ; HL = dst
  148.     PUSH    BC        ; Save dst
  149.     LD    A,H
  150.     OR    L
  151.     JR    Z,1$
  152.     LD    DE,#0x10
  153.     CALL    .copy_vram
  154. 1$:
  155.     POP    HL        ; HL = dst
  156.     POP    BC        ; BC = src
  157.     LD    DE,#0x10
  158.     CALL    .copy_vram
  159.  
  160.     RET
  161.  
  162.     ;; Draw a point at (B,C) with color D and mode E
  163. .plot::
  164.     PUSH    DE        ; Save color and mode
  165.     LD    DE,#0x8000+0x10*0x10
  166.     LD    A,B
  167.     LD    L,B
  168.     SRL    L
  169.     SRL    L
  170.     SRL    L
  171.     RLC    L
  172.     RLC    L
  173.     RLC    L
  174.     LD    H,#0x00
  175.     ADD    HL,HL
  176.     ADD    HL,DE
  177.     LD    D,H
  178.     LD    E,L
  179.  
  180.     LD    HL,#.y_table
  181.     LD    B,#0x00
  182.     ADD    HL,BC
  183.     ADD    HL,BC
  184.     LD    B,(HL)
  185.     INC    HL
  186.     LD    H,(HL)
  187.     LD    L,B
  188.     ADD    HL,DE
  189.  
  190.     AND    #7
  191.     ADD    #0x10        ; Table of bits is located at 0x0010
  192.     LD    E,A
  193.     LD    D,#0x00
  194.     LD    A,(DE)
  195.     LD    B,A
  196.     CPL
  197.     LD    C,A
  198.  
  199.     POP    DE        ; Restore color and mode
  200.     LD    A,E
  201.     CP    #.SOLID
  202.     JR    NZ,10$
  203.     ;; Solid
  204. 1$:
  205.     LDH    A,(.STAT)
  206.     BIT    1,A
  207.     JR    NZ,1$
  208.  
  209.     LD    A,(HL)
  210.     AND    C
  211.     BIT    0,D
  212.     JR    Z,2$
  213.     OR    B
  214. 2$:
  215.     LD    (HL+),A
  216. 3$:
  217.     LDH    A,(.STAT)
  218.     BIT    1,A
  219.     JR    NZ,3$
  220.  
  221.     LD    A,(HL)
  222.     AND    C
  223.     BIT    1,D
  224.     JR    Z,4$
  225.     OR    B
  226. 4$:
  227.     LD    (HL),A
  228.     RET
  229.  
  230. 10$:
  231.     CP    #.XOR
  232.     JR    NZ,20$
  233.     ;; Xor
  234.     BIT    0,D
  235.     JR    Z,12$
  236. 11$:
  237.     LDH    A,(.STAT)
  238.     BIT    1,A
  239.     JR    NZ,11$
  240.  
  241.     LD    A,(HL)
  242.     XOR    B
  243.     LD    (HL+),A
  244. 12$:
  245.     BIT    1,D
  246.     RET    Z
  247. 13$:
  248.     LDH    A,(.STAT)
  249.     BIT    1,A
  250.     JR    NZ,13$
  251.  
  252.     LD    A,(HL)
  253.     XOR    B
  254.     LD    (HL),A
  255.     RET
  256.  
  257. 20$:
  258.     CP    #.OR
  259.     JR    NZ,30$
  260.     ;; Or
  261.     BIT    0,D
  262.     JR    Z,22$
  263. 21$:
  264.     LDH    A,(.STAT)
  265.     BIT    1,A
  266.     JR    NZ,21$
  267.  
  268.     LD    A,(HL)
  269.     OR    B
  270.     LD    (HL+),A
  271. 22$:
  272.     BIT    1,D
  273.     RET    Z
  274. 23$:
  275.     LDH    A,(.STAT)
  276.     BIT    1,A
  277.     JR    NZ,23$
  278.  
  279.     LD    A,(HL)
  280.     OR    B
  281.     LD    (HL),A
  282.     RET
  283.  
  284. 30$:
  285.     CP    #.AND
  286.     RET    NZ
  287.     ;; And
  288.     BIT    0,D
  289.     JR    NZ,32$
  290. 31$:
  291.     LDH    A,(.STAT)
  292.     BIT    1,A
  293.     JR    NZ,31$
  294.  
  295.     LD    A,(HL)
  296.     AND    C
  297.     LD    (HL+),A
  298. 32$:
  299.     BIT    1,D
  300.     RET    NZ
  301. 33$:
  302.     LDH    A,(.STAT)
  303.     BIT    1,A
  304.     JR    NZ,33$
  305.  
  306.     LD    A,(HL)
  307.     AND    C
  308.     LD    (HL),A
  309.     RET
  310.  
  311.     ;; ************************************************************
  312.     ;; Draw a line from x1,y1 (B,C) to x2,y2 (D,E) with color H and mode L
  313.     ;
  314.     ; BC: current point
  315.     .area    _BSS
  316. .a_diff:
  317.     .ds    0x01
  318. .a_xy:
  319.     .ds    0x01
  320. .sx:
  321.     .ds    0x01
  322. .sy:
  323.     .ds    0x01
  324. .line_color:
  325.     .ds    0x01
  326. .line_mode:
  327.     .ds    0x01
  328.  
  329.     .area    _CODE
  330. .line:
  331.     LD    A,H
  332.     LD    (.line_color),A
  333.     LD    A,L
  334.     LD    (.line_mode),A
  335.     ; ax = ABS(x2-x1)<<1; sx = SGN(x2-x1);
  336.     ;
  337.     LD    A,D
  338.     SUB    B            ; A=x2-x1
  339.     JR    C,1$
  340.     ; x2-x1 >= 0
  341.                     ; A=ABS(x2-x1)
  342.     LD    H,A            ; Backup ABS(x2-x1) in H
  343.     LD    A,#0x01            ; A=SGN(x2-x1)=1
  344.     JR    2$
  345. 1$:    ; x2-x1 < 0
  346.     CPL                ; A=ABS(x2-x1)
  347.     INC    A
  348.     LD    H,A            ; Backup ABS(x2-x1) in H
  349.     LD    A,#0xFF            ; A=SGN(x2-x1)=-1
  350. 2$:
  351.     LD    (.sx),A
  352.  
  353.     ; ay = ABS(y2-y1)<<1; sy = SGN(y2-y1);
  354.     ;
  355.     LD    A,E
  356.     SUB    C            ; A=y2-y1
  357.     JR    C,3$
  358.     ; y2-y1 >= 0
  359.                     ; A=ABS(y2-y1)
  360.     LD    L,A            ; Backup ABS(y2-y1) in L
  361.     LD    A,#0x01            ; A=SGN(y2-y1)=1
  362.     JR    4$
  363. 3$:    ; y2-y1 < 0
  364.     CPL                ; A=ABS(y2-y1)
  365.     INC    A
  366.     LD    L,A            ; Backup ABS(y2-y1) in L
  367.     LD    A,#0xFF            ; A=SGN(y2-y1)=-1
  368. 4$:
  369.     LD    (.sy),A
  370.  
  371.     ; if(ax>ay)
  372.     ;
  373.     LD    A,L
  374.     SUB    H            ; A=ay>>1-ax>>1
  375.     JR    NC,7$
  376.  
  377.     ; ax>ay (x dominant)
  378.     LD    A,H
  379.     SUB    L            ; A=ax>>1-ay>>1
  380.      ADD    A
  381.     LD    (.a_diff),A        ; a_diff=ax-ay
  382.     LD    A,L
  383.     ADD    A
  384.     LD    (.a_xy),A        ; a_xy=ay
  385.     ; d = (ay<<1)-ax;
  386.     ;
  387.     LD    A,L
  388.     ADD    A
  389.     SUB    H            ; A=ay-(ax>>1)=(ay<<1)-ax=(L<<1)-H
  390.     LD    L,A            ; HL=d
  391.     LD    A,#0x00
  392.     SBC    A
  393.     LD    H,A
  394.  
  395.     ; for(;;)
  396.     ;
  397. 5$:
  398.     ; plot(x,y);
  399.     ;
  400.     CALL    .line_plot
  401.     ; if(x==x2) return;
  402.     ;
  403.     LD    A,D
  404.     CP    B
  405.     RET    Z
  406.     ; if(d>=0)
  407.     ;
  408.     LD    A,H
  409.     AND    #0x80
  410.     JR    NZ,6$
  411.     ; d>=0
  412.     ; x+=sx;
  413.     ;
  414.     LD    A,(.sx)
  415.     ADD    B
  416.     LD    B,A
  417.     ; y+=sy;
  418.     ;
  419.     LD    A,(.sy)
  420.     ADD    C
  421.     LD    C,A
  422.     ; d-=(ax-ay);
  423.     ;
  424.     LD    A,(.a_diff)
  425.     LD    H,A
  426.     LD    A,L
  427.     SUB    H
  428.     LD    L,A
  429.     LD    A,#0x00
  430.     SBC    A
  431.     LD    H,A
  432.     JR    5$
  433. 6$:    ; d<0
  434.     ; x+=sx;
  435.     ;
  436.     LD    A,(.sx)
  437.     ADD    B
  438.     LD    B,A
  439.     ; d+=ay;
  440.     ;
  441.     LD    A,(.a_xy)
  442.     ADD    L
  443.     LD    L,A
  444.     LD    A,H
  445.     ADC    #0x00
  446.     LD    H,A
  447.     JR    5$
  448.  
  449. 7$:    ; ax<=ay (y dominant)
  450.      ADD    A
  451.     LD    (.a_diff),A        ; a_diff=ay-ax
  452.     LD    A,H
  453.     ADD    A
  454.     LD    (.a_xy),A        ; a_xy=ax
  455.     ; d = (ax<<1)-ay;
  456.     ;
  457.     LD    A,H
  458.     ADD    A
  459.     SUB    L            ; A=(ax<<1)-ay=ax-(ay>>1)=(H<<1)-L
  460.     LD    L,A            ; HL=d
  461.     LD    A,#0x00
  462.     SBC    A
  463.     LD    H,A
  464.  
  465.     ; for(;;)
  466.     ;
  467. 8$:
  468.     ; plot(x,y);
  469.     ;
  470.     CALL    .line_plot
  471.     ; if(y==y2) return;
  472.     ;
  473.     LD    A,E
  474.     CP    C
  475.     RET    Z
  476.     ; if(d>=0)
  477.     ;
  478.     LD    A,H
  479.     AND    #0x80
  480.     JR    NZ,9$
  481.     ; d>=0
  482.     ; x+=sx;
  483.     ;
  484.     LD    A,(.sx)
  485.     ADD    B
  486.     LD    B,A
  487.     ; y+=sy;
  488.     ;
  489.     LD    A,(.sy)
  490.     ADD    C
  491.     LD    C,A
  492.     ; d-=(ay-ax);
  493.     ;
  494.     LD    A,(.a_diff)
  495.     LD    H,A
  496.     LD    A,L
  497.     SUB    H
  498.     LD    L,A
  499.     LD    A,#0x00
  500.     SBC    A
  501.     LD    H,A
  502.     JR    8$
  503. 9$:    ; d<0
  504.     ; y+=sy;
  505.     ;
  506.     LD    A,(.sy)
  507.     ADD    C
  508.     LD    C,A
  509.     ; d+=ax;
  510.     ;
  511.     LD    A,(.a_xy)
  512.     ADD    L
  513.     LD    L,A
  514.     LD    A,H
  515.     ADC    #0x00
  516.     LD    H,A
  517.     JR    8$
  518.  
  519.     ;; ************************************************************
  520.     ;; Plot a point at (B,C)
  521.     ;; Save registers
  522.     ;
  523. .line_plot:
  524.     PUSH    BC
  525.     PUSH    DE
  526.     PUSH    HL
  527.     LD    A,(.line_color)
  528.     LD    D,A
  529.     LD    A,(.line_mode)
  530.     LD    E,A
  531.     CALL    .plot
  532.     POP    HL
  533.     POP    DE
  534.     POP    BC
  535.     RET
  536.  
  537. _plot::
  538.     PUSH    BC
  539.  
  540.     LD    A,(.mode)
  541.     CP    #.G_MODE
  542.     JR    Z,1$
  543.     CALL    .gmode
  544. 1$:
  545.     LDA    HL,4(SP)    ; Skip return address and registers
  546.     LD    B,(HL)        ; B = x
  547.     INC    HL
  548.     LD    C,(HL)        ; C = y
  549.     INC    HL
  550.     LD    D,(HL)        ; D = color
  551.     INC    HL
  552.     LD    E,(HL)        ; E = mode
  553.  
  554.     CALL    .plot
  555.  
  556.     POP    BC
  557.     RET
  558.  
  559. _switch_data::
  560.     PUSH    BC
  561.  
  562.     LD    A,(.mode)
  563.     CP    #.G_MODE
  564.     JR    Z,1$
  565.     CALL    .gmode
  566. 1$:
  567.     LDA    HL,4(SP)    ; Skip return address and registers
  568.     LD    B,(HL)        ; B = x
  569.     INC    HL
  570.     LD    C,(HL)        ; C = y
  571.     INC    HL
  572.     LD    E,(HL)        ; DE = src
  573.     INC    HL
  574.     LD    D,(HL)
  575.     INC    HL
  576.     LD    A,(HL+)        ; HL = dst
  577.     LD    H,(HL)
  578.     LD    L,A
  579.  
  580.     CALL    .switch_data
  581.  
  582.     POP    BC
  583.     RET
  584.  
  585. _line::
  586.     PUSH    BC
  587.  
  588.     LD    A,(.mode)
  589.     CP    #.G_MODE
  590.     JR    Z,1$
  591.     CALL    .gmode
  592. 1$:
  593.     LDA    HL,4(SP)    ; Skip return address and registers
  594.     LD    B,(HL)        ; B = x1
  595.     INC    HL
  596.     LD    C,(HL)        ; C = y1
  597.     INC    HL
  598.     LD    D,(HL)        ; D = x2
  599.     INC    HL
  600.     LD    E,(HL)        ; E = y2
  601.     INC    HL
  602.     LD    A,(HL+)        ; H = color
  603.     LD    L,(HL)        ; L = mode
  604.     LD    H,A
  605.  
  606.     CALL    .line
  607.  
  608.     POP    BC
  609.     RET
  610.  
  611. _draw_image::
  612.     PUSH    BC
  613.  
  614.     LD    A,(.mode)
  615.     CP    #.G_MODE
  616.     JR    Z,1$
  617.     CALL    .gmode
  618. 1$:
  619.     LDA    HL,4(SP)    ; Skip return address and registers
  620.     LD    C,(HL)        ; HL = data
  621.     INC    HL
  622.     LD    B,(HL)
  623.  
  624.     CALL    .draw_image
  625.  
  626.     POP    BC
  627.     RET
  628.  
  629. _clear::            ; Clear the graphics screen
  630.     LD    HL,#0x8000+0x10*0x10
  631.     LD    DE,#0x1680
  632. 1$:
  633.     LDH    A,(.STAT)
  634.     AND    #0x02
  635.     JR    NZ,1$
  636.  
  637.     LD    (HL+),A        ; A is already zero
  638.     DEC    DE
  639.     LD    A,D
  640.     OR    E
  641.     JR    NZ,1$
  642.     RET
  643.  
  644.     .area    _DATA
  645.  
  646. .y_table::
  647.     .word    0x0000,0x0002,0x0004,0x0006,0x0008,0x000A
  648.     .word    0x000C,0x000E,0x0140,0x0142,0x0144,0x0146
  649.     .word    0x0148,0x014A,0x014C,0x014E,0x0280,0x0282
  650.     .word    0x0284,0x0286,0x0288,0x028A,0x028C,0x028E
  651.     .word    0x03C0,0x03C2,0x03C4,0x03C6,0x03C8,0x03CA
  652.     .word    0x03CC,0x03CE,0x0500,0x0502,0x0504,0x0506
  653.     .word    0x0508,0x050A,0x050C,0x050E,0x0640,0x0642
  654.     .word    0x0644,0x0646,0x0648,0x064A,0x064C,0x064E
  655.     .word    0x0780,0x0782,0x0784,0x0786,0x0788,0x078A
  656.     .word    0x078C,0x078E,0x08C0,0x08C2,0x08C4,0x08C6
  657.     .word    0x08C8,0x08CA,0x08CC,0x08CE,0x0A00,0x0A02
  658.     .word    0x0A04,0x0A06,0x0A08,0x0A0A,0x0A0C,0x0A0E
  659.     .word    0x0B40,0x0B42,0x0B44,0x0B46,0x0B48,0x0B4A
  660.     .word    0x0B4C,0x0B4E,0x0C80,0x0C82,0x0C84,0x0C86
  661.     .word    0x0C88,0x0C8A,0x0C8C,0x0C8E,0x0DC0,0x0DC2
  662.     .word    0x0DC4,0x0DC6,0x0DC8,0x0DCA,0x0DCC,0x0DCE
  663.     .word    0x0F00,0x0F02,0x0F04,0x0F06,0x0F08,0x0F0A
  664.     .word    0x0F0C,0x0F0E,0x1040,0x1042,0x1044,0x1046
  665.     .word    0x1048,0x104A,0x104C,0x104E,0x1180,0x1182
  666.     .word    0x1184,0x1186,0x1188,0x118A,0x118C,0x118E
  667.     .word    0x12C0,0x12C2,0x12C4,0x12C6,0x12C8,0x12CA
  668.     .word    0x12CC,0x12CE,0x1400,0x1402,0x1404,0x1406
  669.     .word    0x1408,0x140A,0x140C,0x140E,0x1540,0x1542
  670.     .word    0x1544,0x1546,0x1548,0x154A,0x154C,0x154E
  671.